/**
 * 描述:算法
 *  1.限流算法
 *      1.固定窗口：每个时间段是一个窗口，计数器每过一个时间段就会重置，请求次数小于阈值，则计数器+1，大于的话拒绝访问，时间段一过去，计数器清零
 *          问题：临界问题，比如一个窗口是0-1s，在0.55s的时候突然进来大量请求；在1.05秒的时候又突然进来大量请求，这期间的流量系统无法处理
 *      2.滑动窗口：解决固定窗口临界问题，记录每次请求的时间，统计每次请求往前推1s的请求数，请求数小于阈值则放行
 *          问题：需要统计每个请求到达的时间点，占用资源较多
 *               无法解决短时间之内的流量激增
 *      3.漏桶算法：水滴持续滴入水中，底部固定流出。如果水滴滴入速率大于流出速率，当水超过漏洞的时候，就会溢出。来了请求，放入桶中，桶内充满请求，则拒绝请求，从桶中固定速率拿请求
 *          问题：面对突发的流量，不希望固定速率处理
 *      4.令牌桶算法：定速地往桶里塞令牌，令牌数量超过桶的限制，丢弃，请求来了先向桶内索要令牌，索要成功则被处理，反之丢弃。   LeakyBucketAlgorithm
 *          令牌桶从桶里拿出令牌的速率不是固定的，放入的速率才是固定的
 *  2.负载均衡算法
 *      1.随机：缺点和轮询相似
 *      2.加权随机：
 *      3.轮询:木桶效应，集群性能瓶颈更多地会受到最差的服务器的影响
 *      4.加权轮询：给配置高，负载低的机器配置更高的权重，nginx实现的平滑的加权轮询算法   SmoothWeightedRoundRobin
 *      5.源地址哈希：根据客户端ip，通过hash计算得到一个数值，特点是相同ip每次都会到同一台服务器上，缺点是某个节点故障会导致不可用
        6.区域感知
 *  3.动态负载均衡算法：
 *      1.最小连接数
 *      2.最快响应速度
 *      3.观察者模式：综合最小连接数和最快响应速度
 *  4.缓存淘汰算法：
 *      1.LRU（最近最少使用），算法根据数据的历史访问记录来进行淘汰数据，核心思想：如果数据最近被访问过，那么将来被访问的几率也更高
 *          1.实现：
 *              1.使用链表保存数据，新数据插入到链表头部
 *              2.缓存命中时，将数据移到链表头部
 *              3.链表满的时候，将链表尾部数据丢弃
 *          2.问题
 *              1.当存在偶发性的和周期性的批量操作的时候，会导致LRU的命中率下降，缓存污染
 *      2.LRU-K，K代表最近使用次数，解决缓存污染问题
 *          1.实现：
 *              1.当数据第一次被访问，加入到访问历史列表
 *              2.如果数据在访问历史列表没达到k次访问，则按照一定的规则淘汰
 *              3.当访问历史队列中的数据达k次访问时，将数据从历史队列删除，将数据移到缓存队列中，并缓存此数据，缓存队列重新按照时间排序
 *              4.缓存队列中的数据被再次访问后，再重新排序
 *              5.需要淘汰数据时，淘汰缓存队列中排在末尾的数据，即淘汰k次访问的数据中离现在最久的数据
 *          2.问题：
 *              1.需要记录被访问过的、还没放入缓存的对象，因此消耗内存
 *              2.需要基于时间排序，消耗cpu
 *      3.LFU，最不经常使用的数据被淘汰
 *          1.实现
 *              1.使用一个计数器来记录数据被访问的次数
 *              2.维护一个从大到小的计数队列
 *              3.最低访问次数的首先被淘汰
 *          2.问题：无法解决一种情况：一个最初高访问率之后长时间没有被访问的数据
 *      4.FIFO，先来先淘汰
 *          1.实现
 *              1.维护固定大小的队列
 *              2.缓存命中则存入队列队头
 *              3.队列到达最大，则淘汰末尾
 *   5.假如内存中有100亿的int型数据，你怎么找到top10数据(除了排序，求思路)
 *      1.用最小堆，选取出10个数字的最小堆，然后遍历所有数字，并且跟堆顶的最小数字比较。如果比最小数字小，则继续读取后面的数字，
 *        如果比堆顶的数字大，则替换堆顶的元素并重新调整为最小堆。整个过程需要10亿个数的遍历，内存可控,时间复杂度nlogk
 *      2.采用分治法，优点像快速排序那样，这个能不讲就别讲了
 * @author
 * @created 2022/2/15 9:06
 */
public class Algorithm {
}
